package com.maltys.dp;

/**
 * 数组的每个下标作为⼀个阶梯，第 i 个阶梯对应着⼀个⾮负数的体⼒花费值 cost[i]（下标从 0 开始）。
 * 每当你爬上⼀个阶梯你都要花费对应的体⼒值，⼀旦⽀付了相应的体⼒值，你就可以选择向上爬⼀个阶梯或者爬两
 * 个阶梯。
 * 请你找出达到楼层顶部的最低花费。在开始时，你可以选择从下标为 0 或 1 的元素作为初始阶梯。
 * <p>
 * 给你⼀个整数数组 cost ，其中 cost[i] 是从楼梯第 i 个台阶向上爬需要⽀付的费⽤。⼀旦你⽀付此费⽤，即可选择
 * 向上爬⼀个或者两个台阶。
 * 你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。
 * 请你计算并返回达到楼梯顶部的最低花费
 *
 * @author malty
 * @link <a href="https://leetcode.cn/problems/min-cost-climbing-stairs/">使用最小花费爬楼梯</a>
 */
public class MinCostClimbStairs {

    public static void main(String[] args) {
        MinCostClimbStairs minCostClimbStairs = new MinCostClimbStairs();
        int climbStairs = minCostClimbStairs.minCostClimbingStairs(new int[]{10, 15, 20});
        System.out.println(climbStairs);
    }

    public int minCostClimbingStairs(int[] cost) {
        if (cost.length < 2) {
            return 0;
        }
        int[] dp = new int[cost.length + 1];
        for (int i = 2; i <= cost.length; i++) {
            dp[i] = Math.min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);
        }
        return dp[cost.length];
    }
}
